#include <iostream>
#include <assert.h>
#include <cstdio>
#include <unistd.h>
#include <signal.h>


using std::cout;
using std::endl;

void catchSig(int signum)
{
    cout<<"铺捉到一个信号"<<endl;
}


static void showPending(sigset_t &pending)
{
    for (int sig = 1; sig <= 31; sig++)
    {
        if (sigismember(&pending, sig))//是否加入到参数集里面
            std::cout << "1";
        else
            std::cout << "0";
    }
    std::cout << std::endl;
}
static void blockSig(int sig)
{
    sigset_t bset;
    sigemptyset(&bset);
    sigaddset(&bset, sig);
    int n = sigprocmask(SIG_BLOCK, &bset, nullptr);
    assert(n == 0);
    (void)n;
}
int main()
{
    signal(2,catchSig);//捕捉信号
    sigset_t bset, obset;//定义信号
    sigset_t pending;
    sigemptyset(&bset);//初始化信号
    sigemptyset(&obset);
    sigemptyset(&pending);

    //定义要屏蔽的信号
    sigaddset(&bset, 2 /*SIGINT*/);
    //设置set到内核中对应的进程内部[默认情况进程不会对任何信号进行block]
    int n = sigprocmask(SIG_BLOCK, &bset, &obset);//sigprocmask
    assert(n == 0);
    (void)n;

    int count = 0;

    while (true)
    {
        // 5.1 获取当前进程的pending信号集
        sigpending(&pending);
        // 5.2 显示pending信号集中的没有被递达的信号
        showPending(pending);
        sleep(1);
        count++;
        if (count == 20)
        {
            // 默认情况下，恢复对于2号信号的block的时候，确实会进行递达
            // 但是2号信号的默认处理动作是终止进程！
            // 需要对2号信号进行捕捉
            std::cout << "解除对于2号信号的block" << std::endl;
            int n = sigprocmask(SIG_SETMASK, &obset, nullptr);
            assert(n == 0);
            (void)n;
        }
    }

    return 0;
}
// int main()
// {
//     for(int signum=1;signum<32;signum++)
//     {
//         signal(signum,catchSig);
//     }
//     while(true)
//     {
//         sleep(1);
//     }
//     return 0;
// }